package main

import (
	"errors"
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"time"
)

var logger *zap.Logger //日志记录器Logger、SugaredLogger，对性能要求高就是用Logger

func initLogger() {
	//1、Encoder
	encoder := getEncoder()

	//2、WriterSyncer
	writeSyncer := getLogWriter()

	//3、创建zapcore.Core
	core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)

	//4、New方法自定义
	logger = zap.New(core, zap.AddCaller())
}

func getEncoder() zapcore.Encoder {
	encoderConfig := zapcore.EncoderConfig{
		//定义日志的key和value
		LevelKey:    "等级",
		EncodeLevel: zapcore.LowercaseLevelEncoder, //日志等级小写，如果希望大写请使用：zapcore.CapitalLevelEncoder,

		//定义表示日志时间的key和value
		TimeKey:    "时间",
		EncodeTime: zapcore.TimeEncoderOfLayout("2006-01-03 15:04:05 "),

		//定义message的key和value，value是logger.Error等记录日志函数的第一个参数
		MessageKey: "提示信息",

		//定义当前生成这条日志的调用位置的key和value，只有在zap.New(core, zap.AddCaller())中添加第二个参数，才会输出这个字段
		CallerKey:    "调用位置",
		EncodeCaller: zapcore.ShortCallerEncoder,

		NameKey:       "logger",
		FunctionKey:   zapcore.OmitKey,
		StacktraceKey: "stacktrace",
		LineEnding:    zapcore.DefaultLineEnding,

		EncodeDuration: zapcore.SecondsDurationEncoder,
	}
	return zapcore.NewJSONEncoder(encoderConfig)
}

func getLogWriter() zapcore.WriteSyncer {
	//file, _ := os.Create("./test.log")
	//return zapcore.AddSync(file)

	//file, err := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	//if err != nil {
	//	fmt.Printf("%v\n", err)
	//}
	//return zapcore.AddSync(file)

	lumberJackLogger := lumberjack.Logger{
		Filename:   "./test.log", //日志文件的位置
		MaxSize:    1,            //日志文件的最大大小（以MB为单位）
		MaxBackups: 5,            //保留旧文件的最大个数
		MaxAge:     1,            //保留旧文件的最大天数
		Compress:   false,        //是否压缩/归档旧文件
	}
	return zapcore.AddSync(&lumberJackLogger)
}

func main() {
	initLogger()
	defer logger.Sync() //写入磁盘
	for {

		logger.Error(
			"访问错误",
			zap.String("url", "www.baidu.com"),
			zap.Error(errors.New("11")),
		)
		time.Sleep(time.Millisecond * 1)
	}

}
